﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace PruebaAlgoritmoGenetico
{
    class Program
    {
        const int N = 100, rango=100;
        const int porc_padres = 70; //porcentaje valido para escoger padres

        public static String[] individuo = new String[N];
        public static String[] hijos = new String[2];
        public static int[] vector_decimal = new int[N];
        public static int p1, p2,longitud,hijo,iteraciones = 100;
            
            
          

        static void Main(string[] args)
        {
            
            inicializacion();

            while (iteraciones > 0)
            { 
                /*calcular_funcion_objetivo()
                  cuyos valores se encuentran en valor_decimal */

                escoger_padres();
                cruce();

                iteraciones= iteraciones - 1;
            
            
            }

        }
     

        private static void inicializacion()
        {
            int [] cvector_decimal = new int[N];
            Random obj = new Random();
            int num,copia_rango =rango;
            String cad_longitud = "";
           
            for (int h = 0; h < N; h++)
                individuo[h] = "";

                //calcula la longitud del numero binario del rango
                while (copia_rango > 0)
                {
                    cad_longitud = (copia_rango % 2 == 1) ? cad_longitud.Insert(0, "1") : cad_longitud.Insert(0, "0");
                    copia_rango = copia_rango / 2;
                }


            longitud = cad_longitud.Length;


            
            //genera numero binario

            for (int i = 0; i < N; i++)
            { 
                num= obj.Next(1,rango);
                vector_decimal[i] = num;

                cvector_decimal[i] = num;
                while (cvector_decimal[i] > 0) 
                {
                    individuo[i] = (cvector_decimal[i] % 2 == 1) ? individuo[i].Insert(0, "1") : individuo[i].Insert(0, "0");
                    cvector_decimal[i]=cvector_decimal[i]/2;
                }

                //rellena con 0s si es necesario
                if (individuo[i].Length < longitud) 
                {
                    int dif = longitud - individuo[i].Length;
                    for (int j = 0; j < dif; j++)
                        individuo[i] = individuo[i].Insert(0, "0");                
                }
            
            }


            for (int i = 0; i < N; i++)
                Console.WriteLine(individuo[i]);
           Console.ReadKey();

        }
       
        private static void escoger_padres()
        {

            //buscar numero mayor
            int mayor = 0,padre_valido,ubic_padre,cont=0;
            Random pad = new Random();
           
            for (int i = 0; i < N; i++ )
            {
                if (vector_decimal[i] > mayor)
                    mayor = vector_decimal[i];
            }

            padre_valido = (mayor * porc_padres) / 100;

            //buscar padres
            do
            {

                ubic_padre = pad.Next(N);
                if (vector_decimal[ubic_padre] > padre_valido)
                {
                    cont++;
                    if (cont == 1) p1 = ubic_padre;
                    else p2 = ubic_padre;

                }
            } while (cont!=2);
        }

        private static void cruce()
        {

            Random obj = new Random();

            int pto_cruce;
            double num1=0,num2=0;
            for (int h = 0; h < 2; h++)
            {
                
                pto_cruce = obj.Next(1, longitud);

                if (h == 0)
                {
                    hijos[h] = individuo[p1].Substring(0, pto_cruce);
                    hijos[h] = hijos[h] + individuo[p2].Substring(pto_cruce);
                    for (int j = 1; j <= hijos[h].Length; j++)
                    {
                        byte n = byte.Parse(hijos[h].Substring(hijos[h].Length - j, 1));

                        if (n == 1)
                            num1 += System.Math.Pow(2, j - 1);

                    }
                }
                else
                {
                    hijos[h] = individuo[p2].Substring(0, pto_cruce);
                    hijos[h] = hijos[h] + individuo[p1].Substring(pto_cruce);
                    for (int j = 1; j <= hijos[h].Length; j++)
                    {
                        byte n = byte.Parse(hijos[h].Substring(hijos[h].Length - j, 1));

                        if (n == 1)
                            num2 += System.Math.Pow(2, j - 1);

                    }
                
                
                }

                //elige con cual hijo se queda
                if (num1 > num2) hijo = 0;
                else hijo = 1;
            }

            Console.WriteLine("Hijo:{0}",hijos[hijo]);
            Console.ReadKey();



        }
    }
}
